package database

import (
	"fmt"
	"oa-system/internal/config"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
)

var DB *gorm.DB

func InitDB() error {
	var err error

	// GORM 配置
	gormConfig := &gorm.Config{
		// 命名策略
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 使用单数表名
		},
		// 日志配置
		Logger: logger.Default.LogMode(logger.Info),
		// 禁用默认事务
		SkipDefaultTransaction: true,
		// 准备语句
		PrepareStmt: true,
	}

	// 连接数据库
	DB, err = gorm.Open(mysql.Open(config.GetDSN()), gormConfig)
	if err != nil {
		return fmt.Errorf("连接数据库失败: %w", err)
	}

	// 获取通用数据库对象
	sqlDB, err := DB.DB()
	if err != nil {
		return fmt.Errorf("获取数据库连接失败: %w", err)
	}

	// 设置连接池参数
	sqlDB.SetMaxIdleConns(config.GlobalConfig.Database.MaxIdleConns)
	sqlDB.SetMaxOpenConns(config.GlobalConfig.Database.MaxOpenConns)
	sqlDB.SetConnMaxLifetime(time.Duration(config.GlobalConfig.Database.ConnMaxLifetime) * time.Second)
	sqlDB.SetConnMaxIdleTime(time.Duration(config.GlobalConfig.Database.ConnMaxIdleTime) * time.Second)

	// 测试数据库连接
	if err := sqlDB.Ping(); err != nil {
		return fmt.Errorf("数据库连接测试失败: %w", err)
	}

	// 自动迁移表结构
	// if err := autoMigrate(); err != nil {
	// 	return fmt.Errorf("数据库迁移失败: %w", err)
	// }

	return nil
}

// CloseDB 关闭数据库连接
func CloseDB() {
	if DB != nil {
		sqlDB, err := DB.DB()
		if err == nil {
			sqlDB.Close()
		}
	}
}

// autoMigrate 自动迁移表结构
// func autoMigrate() error {
// 	// 在这里添加需要自动迁移的模型
// 	return DB.AutoMigrate(
// 	// &model.User{},
// 	// &model.Role{},
// 	// 添加其他模型...
// 	)
// }

// Transaction 事务封装
func Transaction(fn func(tx *gorm.DB) error) error {
	return DB.Transaction(fn)
}
